home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / dsp / 96000tar.z / 96000tar / 96000 / appb / b115c.asm < prev    next >
Assembly Source File  |  1992-04-28  |  9KB  |  192 lines

  1. ; This program was originally published in the Motorola DSP96002 Users Manual
  2. ; and is provided under a DISCLAIMER OF WARRANTY available from Motorola DSP
  3. ; Operation, 6501 William Cannon Drive West, Austin, Texas 78735-8598.  For
  4. ; more information, refer to the DSP96002 Users Manual, Appendix B, DSP
  5. ; Benchmarks.
  6. ;
  7. ; B.1.15.3    Radix 4 Decimation in Frequency FFT  
  8. ;fftr4z macro   points,data,coef,table,temp 
  9. ;fftr4z ident   1,1 
  10. ; Radix 4 Decimation in Frequency In-Place FFT Routine 
  11. ;    Complex input and output data 
  12. ;       Real data in X memory 
  13. ;       Imaginary data in Y memory 
  14. ;    Normally ordered input data 
  15. ;    Digit reversed output data 
  16. ;    Coefficient lookup table 
  17. ;       Full cycle sinewave in Y memory 
  18. ;       Coefficient table can be generated by "sinewave" macro. 
  19. ; Macro Call - mfftr4z   points,data,coef,table,temp 
  20. ;       points     number of points (4-16384, power of 4) 
  21. ;       data       starting address of data buffer 
  22. ;       coef       starting address of sinewave table 
  23. ;       table      size of sinewave table 
  24. ;       temp       starting address of temporary storage area 
  25. ; Cooley-Tukey Radix 4 FFT Algorithm 
  26. ;            
  27. ; ar,ai                       ar',ai' 
  28. ; br,bi        Radix 4        br',bi' 
  29. ; cr,ci       Butterfly       cr',ci' 
  30. ; dr,di                       dr',di' 
  31. ;             
  32. ;       t1 = ar + cr 
  33. ;       t2 = ar - cr 
  34. ;       t3 = dr + br 
  35. ;       t4 = dr - br 
  36. ;       t5 = ai + ci 
  37. ;       t6 = ai - ci 
  38. ;       t7 = bi + di 
  39. ;       t8 = bi - di 
  40. ;       t9 = t2 + t8 
  41. ;       t10 = t2 - t8 
  42.  
  43. ;       t11 = t6 + t4 
  44. ;       t12 = t6 - t4 
  45. ;       ar' = t1 + t3 
  46. ;       t13 = t1 - t3 
  47. ;       ai' = t5 + t7 
  48. ;       t14 = t5 - t7 
  49. ;       br' = t9*wr1 + t11*wi1 
  50. ;       bi' = t11*wr1 - t9*wi1 
  51. ;       cr' = t13*wr2 + t14*wi2 
  52. ;       ci' = t14*wr2 - t13*wi2 
  53. ;       dr' = t10*wr3 + t12*wi3 
  54. ;       di' = t12*wr3 - t10*wi3 
  55. ; Address pointers are organized as follows: 
  56. ;       r0 = ar,ai,br,bi pointer        n0 = butterflies per group 
  57. ;       r1 = wr (cos) pointer           n1 = rotation factor 
  58. ;       r2 = temp storage pointer       n2 = groups per pass 
  59. ;       r3 = group index counter        n3 = rotation factor 
  60. ;       r4 = cr,ci,dr,di pointer        n4 = butterflies per group 
  61. ;       r5 = wi (sin) pointer           n5 = rotation factor 
  62. ;       r6 = temp storage pointer       n6 = not used 
  63. ;       r7 = not used                   n7 = not used 
  64. ; Alters Data ALU Registers 
  65. ;       d0      d4      d8 
  66. ;       d1      d5      d9 
  67. ;       d2      d6 
  68. ;       d3      d7 
  69. ; Alters Address Registers 
  70. ;       r0      n0      m0 
  71. ;       r1      n1      m1 
  72. ;       r2      n2      m2 
  73. ;       r3      n3      m3 
  74. ;       r4      n4      m4 
  75. ;       r5      n5      m5 
  76. ;       r6              m6 
  77.  
  78. ; Alters Program Control Registers 
  79. ;       pc      sr 
  80. ; Uses 6 locations on System Stack 
  81. ; This program has not been exhaustively tested and may contain errors. 
  82. ;                                                               ICycles Prog
  83. ;                                                           Word    Cycle
  84.     page                      ; 
  85.     move    #points/4,n0      ;initialize butterflies per group   2    2 
  86.     move    n0,n4             ;            "                      1    1 
  87.     move    #1,n2             ;initialize groups per pass         1    1 
  88.     move    #1,n3             ;initialize w rotation factor       1    1 
  89.     move    #-1,m0            ;initialize linear addressing       1    1 
  90.     move    m0,m1             ;            "                      1    1 
  91.     move    m0,m2             ;            "                      1    1 
  92.     move    m0,m3             ;            "                      1    1 
  93.     move    m0,m4             ;            "                      1    1 
  94.     move    m0,m5             ;            "                      1    1 
  95.     move    m0,m6             ;            "                      1    1 
  96.     move    #temp,r2          ;initialize temp storage pointers   2    2 
  97.     move    (r2)+,r6          ;            "                      1    1 
  98.     move    #0,r3             ;initialize group index counter     1    1 
  99.     move    #coef+table/4,r1  ;initialize wr (cos) pointer        2    2 
  100.     move    #coef,r5          ;initialize wi (sin) pointer        2    2 
  101. ; Perform all FFT passes with triple nested DO loops 
  102.     do      #@cvi(@log(points)/@log(4)+0.5),_end_pass   ;          2    3 
  103.     move    #data,r4                                    ;          2    2 
  104.  
  105.     do      n2,_end_grp                                 ;          2    3 
  106.     move    r3,n5          ;update rotation factor                1    1 
  107.     move    n5,n1          ;            "                         1    1 
  108.     move    (r5)+n5        ;point at wi1                          1    1 
  109.     move    (r1)+n1        ;point at wr1                          1    1 
  110.     move    (r4)+n4                                     ;          1    1 
  111.     move    r4,r0          ;point at B data (br,bi)               1    1 
  112.     move    (r4)+n4                                     ;          1    1 
  113.     move    (r4)+n4        ;point at D data (dr,di)               1    1 
  114.  
  115.  
  116.     do      n0,_end_bfy                                 ;          2    3 
  117.     move                             x:(r4),d0.s        ;          1    1 
  118.     move                             x:(r0),d7.s  y:(r4),d2.s  ;   1    1 
  119.     faddsub.s d0,d7                               y:(r0)-n0,d5.s ; 1    1 
  120.     faddsub.s d5,d2                  x:(r0),d1.s                 ; 1    1 
  121.     move                             x:(r4)-n4,d4.s              ; 1    1 
  122.     move                             x:(r4),d4.s  y:(r0),d6.s    ; 1    1 
  123.     faddsub.s d1,d4                  d2.s,x:(r2)+ y:(r4),d3.s    ; 1    1 
  124.     faddsub.s d1,d5                               y:(r1)+n1,d8.s ; 1    1 
  125.     fmpy   d5,d8,d2  faddsub.s d6,d3              y:(r5)+n5,d9.s ; 1    1 
  126.     fmpy   d5,d9,d3  faddsub.s d6,d0 d1.s,x:(r2)- d3.s,y:(r6)    ; 1    1 
  127.     faddsub.s d4,d7                  d0.s,d6.s    d6.s,y:(r2)    ; 1    1 
  128.     fmpy.s d6,d9,d0                               y:(r5)+n5,d9.s ; 1    1 
  129.     fmpy   d6,d8,d0  fadd.s  d0,d2                y:(r1)+n1,d8.s ; 1    1 
  130.     fmpy   d4,d8,d3  fsub.s  d3,d0   x:(r2)+,d1.s y:(r6),d5.s    ; 1    1 
  131.     faddsub.s d5,d1                  x:(r2)-,d6.s                ; 1    1 
  132.     fmpy.s d4,d9,d1                  d7.s,x:(r0)+n0 d1.s,y:      ; 1    1 
  133.     fmpy.s d5,d8,d2                  d2.s,x:(r0)    d0.s,y:      ; 1    1 
  134.     fmpy   d5,d9,d0  fsub.s  d1,d2                y:(r1)-n1,d8.s ; 1    1 
  135.     fmpy   d6,d8,d1  fadd.s  d0,d3                y:(r5)-n5,d9.s ; 1    1 
  136.     fmpy.s d6,d9,d0                  d3.s,x:(r4)  y:(r2),d4.s    ; 1    1 
  137.     fmpy.s d4,d8,d3                               d2.s,y:(r4)+n4 ; 1    1 
  138.     fmpy   d4,d9,d2  fsub.s  d0,d3                y:(r1)-n1,d8.s ; 1    1 
  139.     fadd.s    d2,d1                               y:(r5)-n5,d9.s ; 1    1 
  140.     move                             d1.s,x:(r4)  d3.s,y:        ; 1    1 
  141. _end_bfy 
  142.     move    #coef,r5          ;point at wi0                      ; 2    2 
  143.     move    #coef+table/4,r1  ;point at wr0                      ; 2    2 
  144.     move    #0,r3             ;reset group index counter         ; 1    1 
  145. _end_grp 
  146.     move    n0,d0.l           ;get butterflies per group          1    1 
  147.     lsr     d0.l              ;                                   1    1 
  148.     lsr     d0.l    n2,d1.l   ;divide butterflies/group by 4      1    1 
  149.     lsl     d1.l    d0.l,n0   ;multiply groups/pass by 4          1    1 
  150.     lsl     d1.l    n3,d0.l   ;get w rotation factor              1    1 
  151.     lsl     d0.l    d1.l,n2   ;multiply rotation factor by 4      1    1 
  152.     lsl     d0.l    n0,n4     ;                                   1    1 
  153.     move    d0.l,n3           ;                                   1    1 
  154.     move    n0,d1.l           ;check for 1 butterfly per group    1    1 
  155.     lsr     d1.l              ;                                   1    1 
  156.     jne     skip              ;                                   1    2 
  157.     move    #0,n3             ;reset rotation factor - last pass  1    1 
  158. skip    nop                   ;                                   1    1 
  159. _end_pass                     ;                                 ---  --- 
  160.     endm                      ;                                  78   82 
  161.  
  162. ;The speed for 1024 points using a 75ns instruction cycle is 2.72ms,  assuming internal program and 
  163. ;internal data memory.  
  164.